using System;
using System.Windows;
using System.Threading;
using System.Windows.Threading;

namespace LaplaceMeshDeformer
{
    public partial class App : Application
    {
        protected override void OnStartup(StartupEventArgs e)
        {
            try
            {
                // 设置全局异常处理
                AppDomain.CurrentDomain.UnhandledException += CurrentDomain_UnhandledException;
                DispatcherUnhandledException += App_DispatcherUnhandledException;
                
                // 调用基类的OnStartup
                base.OnStartup(e);
                
                // 创建并显示主窗口
                MainWindow mainWindow = new MainWindow();
                
                if (e.Args.Length > 0)
                {
                    // 在窗口加载后加载指定的网格文件
                    mainWindow.Loaded += (sender, args) => 
                    {
                        try
                        {
                            mainWindow.LoadMeshFromPath(e.Args[0]);
                        }
                        catch (Exception ex)
                        {
                            MessageBox.Show($"加载网格文件时出错: {ex.Message}", "错误", 
                                MessageBoxButton.OK, MessageBoxImage.Error);
                            Console.WriteLine($"加载网格文件错误: {ex}");
                        }
                    };
                }
                
                mainWindow.Show();
            }
            catch (Exception ex)
            {
                MessageBox.Show($"应用程序启动时出错: {ex.Message}", "严重错误", 
                    MessageBoxButton.OK, MessageBoxImage.Error);
                Console.WriteLine($"应用程序启动错误: {ex}");
                
                // 退出应用程序
                Shutdown(-1);
            }
        }

        private void App_DispatcherUnhandledException(object sender, DispatcherUnhandledExceptionEventArgs e)
        {
            try
            {
                // 显示异常信息
                string errorMessage = $"发生未处理的异常: {e.Exception.Message}\n\n";
                
                if (e.Exception is System.Runtime.InteropServices.COMException comEx && 
                    comEx.ErrorCode == unchecked((int)0x88980406)) // UCEERR_RENDERTHREADFAILURE
                {
                    errorMessage += "渲染线程失败，可能是因为3D模型太大或复杂。尝试加载一个更小的模型。";
                }
                else
                {
                    errorMessage += $"错误详情: {e.Exception}";
                }
                
                MessageBox.Show(errorMessage, "应用程序错误", 
                    MessageBoxButton.OK, MessageBoxImage.Error);
                
                Console.WriteLine($"UI线程异常: {e.Exception}");
                
                // 标记异常为已处理
                e.Handled = true;
            }
            catch
            {
                // 如果在异常处理过程中又出现异常，确保应用程序能优雅退出
                try
                {
                    MessageBox.Show("发生严重错误，应用程序将关闭。", "严重错误", 
                        MessageBoxButton.OK, MessageBoxImage.Error);
                }
                catch
                {
                    // 最坏情况下什么都不做
                }
                
                // 退出应用程序
                Shutdown(-1);
            }
        }

        private void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e)
        {
            try
            {
                Exception ex = e.ExceptionObject as Exception;
                string errorMessage = "发生未处理的异常";
                
                if (ex != null)
                {
                    errorMessage += $": {ex.Message}\n\n{ex}";
                }
                
                MessageBox.Show(errorMessage, "严重错误", 
                    MessageBoxButton.OK, MessageBoxImage.Error);
                
                Console.WriteLine($"非UI线程异常: {ex}");
            }
            catch
            {
                // 忽略在异常处理程序中的异常
            }
            
            // 如果异常是致命的，退出应用程序
            if (e.IsTerminating)
            {
                try
                {
                    MessageBox.Show("发生致命错误，应用程序将关闭。", "严重错误", 
                        MessageBoxButton.OK, MessageBoxImage.Error);
                }
                catch
                {
                    // 最坏情况下什么都不做
                }
                
                // 确保退出
                Environment.Exit(-1);
            }
        }
    }
} 